Ao criar esta funcionalidade segui o padrão dos arquivos csv padrão, ou seja, vbtab separa os campos e vbcrlf separa as linhas.
Sendo assim após chamar esta função é só abrir o Excel e colar.
Testei com mais de 20.000 registros e demorou uns 4 segundos para fazer a transferência sendo que o tempo depende dos recursos da máquina.
Criei uma função 'limpa' que elimina ou muda os caracteres indesejados no campo original.
Por exemplo, CR, LF, TAB são eliminados pois são delimitadores dos arquivos CSV.
A função limpa também troca o caractere apóstrofo para acento agudo para evitar problemas com o SQL Server.
'copia os dados de um DataGridView para o Clipboard
Private Sub CopiarDGVdgvDadosClipBoard()
Dim a As Integer
Dim b As Integer
Dim c As String
Dim d As String
c = ""
'headers
For b = 0 To FrmDataSet.dgvDados.Columns.Count - 1
c += FrmDataSet.dgvDados.Columns(b).Name + vbTab
Next
c += vbCrLf
'dados
For a = 0 To FrmDataSet.dgvDados.Rows.Count - 1
For b = 0 To FrmDataSet.dgvDados.Columns.Count - 1
If IsDBNull(FrmDataSet.dgvDados.Rows(a).Cells(b).Value) Then
c += vbTab
Else
d = CStr(FrmDataSet.dgvDados.Rows(a).Cells(b).Value)
d = Limpa(d)
c += d + vbTab
End If
Next
c += vbCrLf
Next
Clipboard.Clear()
Clipboard.SetText(c)
End Sub
Public Function Limpa(dado As String) As String
Dim a As String
a = Trim(dado)
If a = "" Then a = " " 'precisa ter pelo menos um caractere para não deixar juntar ||||
a = Replace(a, vbCr, "")
a = Replace(a, vbLf, "")
a = Replace(a, vbTab, "")
a = Replace(a, vbCrLf, "")
a = Replace(a, "|", "")
a = Replace(a, "'", "´")
Return a
End Function